Save a generic boxes source in GtkImageBorder
authorAlexander Larsson <alexl@redhat.com>
Tue, 15 Nov 2011 15:26:46 +0000 (16:26 +0100)
committerAlexander Larsson <alexl@redhat.com>
Thu, 17 Nov 2011 11:27:21 +0000 (12:27 +0100)
We used to special handle gradient, but we want to be able to store
other sources (that will eventually resolve to cairo patterns).
For instance, this is needed to handle win32 theme part sources.

gtk/gtkborderimage.c
gtk/gtkborderimageprivate.h
gtk/gtkstyleproperty.c

index 2fbe8506cdde955a08ec4bdf7bd489185a29fe8b..dd8259131b24ad13467a0a36768c73d7021ddd7a 100644 (file)
@@ -54,7 +54,8 @@ enum {
 
 struct _GtkBorderImage {
   cairo_pattern_t *source;
-  GtkGradient *source_gradient;
+  gpointer source_boxed;
+  GType boxed_type;
 
   GtkBorder slice;
   GtkBorder *width;
@@ -90,18 +91,21 @@ _gtk_border_image_new (cairo_pattern_t         *pattern,
 }
 
 GtkBorderImage *
-_gtk_border_image_new_for_gradient (GtkGradient             *gradient,
-                                    GtkBorder               *slice,
-                                    GtkBorder               *width,
-                                    GtkCssBorderImageRepeat *repeat)
+_gtk_border_image_new_for_boxed (GType                    boxed_type,
+                                gpointer                 boxed,
+                                GtkBorder               *slice,
+                                GtkBorder               *width,
+                                GtkCssBorderImageRepeat *repeat)
 {
   GtkBorderImage *image;
 
   image = g_slice_new0 (GtkBorderImage);
+
   image->ref_count = 1;
 
-  if (gradient != NULL)
-    image->source_gradient = gtk_gradient_ref (gradient);
+  if (boxed != NULL)
+    image->source_boxed = g_boxed_copy (boxed_type, boxed);
+  image->boxed_type = boxed_type;
 
   if (slice != NULL)
     image->slice = *slice;
@@ -137,8 +141,8 @@ _gtk_border_image_unref (GtkBorderImage *image)
       if (image->source != NULL)
         cairo_pattern_destroy (image->source);
 
-      if (image->source_gradient != NULL)
-        gtk_gradient_unref (image->source_gradient);
+      if (image->source_boxed != NULL)
+       g_boxed_free (image->boxed_type, image->source_boxed);
 
       if (image->width != NULL)
         gtk_border_free (image->width);
@@ -157,8 +161,8 @@ _gtk_border_image_unpack (const GValue *value,
   parameter[0].name = "border-image-source";
 
   if ((image != NULL) && 
-      (image->source_gradient != NULL))
-    g_value_init (&parameter[0].value, GTK_TYPE_GRADIENT);
+      (image->source_boxed != NULL))
+    g_value_init (&parameter[0].value, image->boxed_type);
   else
     g_value_init (&parameter[0].value, CAIRO_GOBJECT_TYPE_PATTERN);
 
@@ -173,8 +177,8 @@ _gtk_border_image_unpack (const GValue *value,
 
   if (image != NULL)
     {
-      if (image->source_gradient != NULL)
-        g_value_set_boxed (&parameter[0].value, image->source_gradient);
+      if (image->source_boxed != NULL)
+        g_value_set_boxed (&parameter[0].value, image->source_boxed);
       else
         g_value_set_boxed (&parameter[0].value, image->source);
 
index 585be67985478c7975398753fb3de25c41e8365b..563ce299de08c1771e693ec29ac907737972480e 100644 (file)
@@ -42,7 +42,8 @@ GtkBorderImage *  _gtk_border_image_new              (cairo_pattern_t      *sour
                                                       GtkBorder            *slice,
                                                       GtkBorder            *width,
                                                       GtkCssBorderImageRepeat *repeat);
-GtkBorderImage *  _gtk_border_image_new_for_gradient (GtkGradient          *gradient,
+GtkBorderImage *  _gtk_border_image_new_for_boxed    (GType                 boxed_type,
+                                                     gpointer              boxed,
                                                       GtkBorder            *slice,
                                                       GtkBorder            *width,
                                                       GtkCssBorderImageRepeat *repeat);
index 8913d92560535fbe56c54327b73a62a257780748..99b804f595bd8cc8960a69609a707d501fc20a99 100644 (file)
@@ -1250,7 +1250,8 @@ border_image_value_parse (GtkCssParser *parser,
 {
   GValue temp = G_VALUE_INIT;
   cairo_pattern_t *pattern = NULL;
-  GtkGradient *gradient = NULL;
+  gconstpointer *boxed = NULL;
+  GType boxed_type;
   GtkBorder slice, *width = NULL, *parsed_slice;
   GtkCssBorderImageRepeat repeat, *parsed_repeat;
   gboolean retval = FALSE;
@@ -1261,8 +1262,9 @@ border_image_value_parse (GtkCssParser *parser,
   if (!pattern_value_parse (parser, base, &temp))
     return FALSE;
 
-  if (G_VALUE_TYPE (&temp) == GTK_TYPE_GRADIENT)
-    gradient = g_value_dup_boxed (&temp);
+  boxed_type = G_VALUE_TYPE (&temp);
+  if (boxed_type != CAIRO_GOBJECT_TYPE_PATTERN)
+    boxed = g_value_dup_boxed (&temp);
   else
     pattern = g_value_dup_boxed (&temp);
 
@@ -1297,8 +1299,8 @@ border_image_value_parse (GtkCssParser *parser,
 
   g_value_unset (&temp);
 
-  if (gradient != NULL)
-    image = _gtk_border_image_new_for_gradient (gradient, &slice, width, &repeat);
+  if (boxed != NULL)
+    image = _gtk_border_image_new_for_boxed (boxed_type, boxed, &slice, width, &repeat);
   else if (pattern != NULL)
     image = _gtk_border_image_new (pattern, &slice, width, &repeat);
 
@@ -1312,8 +1314,8 @@ border_image_value_parse (GtkCssParser *parser,
   if (pattern != NULL)
     cairo_pattern_destroy (pattern);
 
-  if (gradient != NULL)
-    gtk_gradient_unref (gradient);
+  if (boxed != NULL)
+    g_boxed_free (boxed_type, boxed);
 
   if (width != NULL)
     gtk_border_free (width);